#include <iostream>
#include <cstdio>
#include <string>
#include <ctime>
#include <mutex>
#include <cstdlib>
#include <unistd.h>
#include <pthread.h>
class Ticket
{
public:
    Ticket():tickets(1000){}
    ~Ticket(){}
    
    bool GetTicket()
    {
        bool res = true;
        mymtx.lock();//加锁

        //访问临界资源tickets
        if(tickets>0)
        {
            usleep(1000); //1s == 1000ms 1ms = 1000us
            std::cout << "我是[" << pthread_self() << "] 我要抢的票是: " << tickets << std::endl;
            tickets--;
            printf("");
        }
        else
        {
            printf("票已经被抢空了\n");
            res = false;
        }
        mymtx.unlock();//解锁
        return res;
    }
private:
    int tickets;
    std::mutex mymtx;//语言级别的
};

void* ThreadRun(void* args)
{
    Ticket* t = (Ticket*)args;
    while(1)
    {
        if(!t->GetTicket())
        {
            break;//没有票了才退出
        }
    }
}
int main()
{
    Ticket *t = new Ticket();

    pthread_t tid[5];
    //创建5个线程
    for(int i = 0; i < 5; i++)
    {
        int *id = new int(i);
        pthread_create(tid+i, nullptr, ThreadRun, (void*)t);
    }
    //线程等待
    for(int i = 0 ; i < 5; i++)
    {
        pthread_join(tid[i], nullptr);
    }
    return 0;
}

// class Ticket
// {
// public:
//     Ticket():tickets(1000)
//     { 
//         pthread_mutex_init(&mtx, nullptr);//初始化互斥锁
//     }
//     ~Ticket()
//     {
//         pthread_mutex_destroy(&mtx);//销毁互斥锁   
//     }
    
//     bool GetTicket()
//     {
//         bool res = true;
//         pthread_mutex_lock(&mtx); //加锁
//         //访问临界资源tickets
//         if(tickets>0)
//         {
//             usleep(1000); //1s == 1000ms 1ms = 1000us
//             std::cout << "我是[" << pthread_self() << "] 我要抢的票是: " << tickets << std::endl;
//             tickets--;
//             printf("");
//         }
//         else
//         {
//             printf("票已经被抢空了\n");
//             res = false;
//         }

//         pthread_mutex_unlock(&mtx);//解锁
//         return res;
//     }
// private:
//     int tickets;
//     pthread_mutex_t mtx;//互斥锁
// };

// void* ThreadRun(void* args)
// {
//     Ticket* t = (Ticket*)args;
//     while(1)
//     {
//         if(!t->GetTicket())
//         {
//             break;//没有票了才退出
//         }
//     }
// }
// int main()
// {
//     Ticket *t = new Ticket();

//     pthread_t tid[5];
//     //创建5个线程
//     for(int i = 0; i < 5; i++)
//     {
//         int *id = new int(i);
//         pthread_create(tid+i, nullptr, ThreadRun, (void*)t);
//     }
//     //线程等待
//     for(int i = 0 ; i < 5; i++)
//     {
//         pthread_join(tid[i], nullptr);
//     }
//     return 0;
// }